home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d19 / propck25.arc / SOURCE.ARC / DOSMEM.PAS < prev    next >
Pascal/Delphi Source File  |  1989-05-29  |  2KB  |  86 lines

  1.  
  2. (*
  3.  * dosmem - Dos Memory Management Unit
  4.  *
  5.  * (C) 1988 Samuel H. Smith
  6.  *
  7.  *)
  8.  
  9. {$i prodef.inc}
  10.  
  11. unit DosMem;
  12.  
  13. interface
  14.    uses DOS;
  15.  
  16.    type
  17.       pointer_rec = record
  18.          offset:  word;
  19.          segment: word;
  20.       end;
  21.  
  22. {  var
  23.       dos_prevavail: longint;  }
  24.  
  25.    function dos_maxavail: longint;
  26.    procedure dos_getmem(var ptrvar; size: word);
  27.    procedure dos_freemem(var ptrvar);
  28.  
  29.  
  30. implementation
  31.  
  32.    function dos_maxavail: longint;
  33.    var
  34.       reg:     registers;
  35.    begin
  36.       reg.ah := $48;    {allocate memory}
  37.       reg.bx := $FFFF;  {more than available, force return of freespace}
  38.       msdos(reg);
  39.     { dos_prevavail := longint(reg.bx) shl 4; }
  40.       dos_maxavail := longint(reg.bx) shl 4;
  41.    end;
  42.  
  43.    procedure dos_getmem(var ptrvar; size: word);
  44.    var
  45.       block:   pointer_rec absolute ptrvar;
  46.       reg:     registers;
  47.    begin
  48.       reg.ah := $48;    {allocate memory}
  49.       reg.bx := (size+15) div 16;
  50.       msdos(reg);
  51.  
  52.       if (reg.flags and Fcarry) <> 0 then
  53.       begin
  54.          writeln('dos_getmem: can''t allocate ',size,' bytes.');
  55.          halt(99);
  56.       end;
  57.  
  58.       block.segment := reg.ax;
  59.       block.offset := 0;
  60.    end;
  61.  
  62.    procedure dos_freemem(var ptrvar);
  63.    var
  64.       block:   pointer_rec absolute ptrvar;
  65.       reg:     registers;
  66.    begin
  67.       if (block.segment = 0) and (block.offset = 0) then
  68.          exit;
  69.  
  70.       reg.ah := $49;    {free memory}
  71.       reg.es := block.segment;
  72.       msdos(reg);
  73.  
  74.       if (reg.flags and Fcarry) <> 0 then
  75.       begin
  76.          writeln('dos_freemem: dispose failure');
  77.          halt(99);
  78.       end;
  79.  
  80.       block.segment := 0;
  81.       block.offset := 0;
  82.    end;
  83.  
  84. end.
  85.  
  86.